package aceim.app.themeable;
import java.lang.reflect.Constructor;
import aceim.api.utils.Logger;
import aceim.app.R;
import aceim.app.themeable.dataentity.ChatMessageItemThemeResource;
import aceim.app.themeable.dataentity.ContactListGridItemThemeResource;
import aceim.app.themeable.dataentity.ContactListPlainItemThemeResource;
import aceim.app.themeable.dataentity.HistoryMessageItemThemeResource;
import aceim.app.themeable.dataentity.TabThemeResource;
import aceim.app.themeable.dataentity.ThemeResource;
import android.content.Context;
public class ThemeResources {
//Layouts
private final ContactListGridItemThemeResource gridItemLayout;
private final ContactListPlainItemThemeResource listItemLayout;
private final ChatMessageItemThemeResource chatMessageItemLayout;
private final HistoryMessageItemThemeResource historyMessageItemLayout;
private final TabThemeResource tabItemLayout;
private final int topBarBackground;
private final int bottomBarBackground;
private final int screenBackground;
private final int bottomBarButtonBackground;
private final int accentBackground;
private final int gridItemSize;
private final int listItemHeight;
private ThemeResources(ContactListGridItemThemeResource gridItemLayout, ContactListPlainItemThemeResource listItemLayout, ChatMessageItemThemeResource chatMessageItemLayout, HistoryMessageItemThemeResource historyMessageItemLayout,
TabThemeResource tabItemLayout, int topBarBackground, int bottomBarBackground, int screenBackground, int bottomBarButtonBackground, int accentBackground, int gridItemSize, int listItemHeight) {
super();
this.gridItemLayout = gridItemLayout;
this.listItemLayout = listItemLayout;
this.chatMessageItemLayout = chatMessageItemLayout;
this.historyMessageItemLayout = historyMessageItemLayout;
this.tabItemLayout = tabItemLayout;
this.topBarBackground = topBarBackground;
this.bottomBarBackground = bottomBarBackground;
this.screenBackground = screenBackground;
this.bottomBarButtonBackground = bottomBarButtonBackground;
this.accentBackground = accentBackground;
this.gridItemSize = gridItemSize;
this.listItemHeight = listItemHeight;
}
/**
* @return the topBarBackground
*/
public int getTopBarBackgroundId() {
return topBarBackground;
}
/**
* @return the bottomBarBackground
*/
public int getBottomBarBackgroundId() {
return bottomBarBackground;
}
/**
* @return the screenBackground
*/
public int getScreenBackgroundId() {
return screenBackground;
}
/**
* @return the bottomBarButtonBackground
*/
public int getBottomBarButtonBackgroundId() {
return bottomBarButtonBackground;
}
/**
* @return the accentBackground
*/
public int getAccentBackgroundId() {
return accentBackground;
}
/**
* @return the gridItemSize
*/
public int getGridItemSizeId() {
return gridItemSize;
}
/**
* @return the listItemHeight
*/
public int getListItemHeightId() {
return listItemHeight;
}
/**
* @return the gridItemLayout
*/
public ContactListGridItemThemeResource getGridItemLayout() {
return gridItemLayout;
}
/**
* @return the listItemLayout
*/
public ContactListPlainItemThemeResource getListItemLayout() {
return listItemLayout;
}
/**
* @return the chatMessageItemLayout
*/
public ChatMessageItemThemeResource getChatMessageItemLayout() {
return chatMessageItemLayout;
}
/**
* @return the historyMessageItemLayout
*/
public HistoryMessageItemThemeResource getHistoryMessageItemLayout() {
return historyMessageItemLayout;
}
/**
* @return the tabItemLayout
*/
public TabThemeResource getTabItemLayout() {
return tabItemLayout;
}
public static class Builder {
//Layouts
private ContactListGridItemThemeResource gridItemLayout;
private ContactListPlainItemThemeResource listItemLayout;
private ChatMessageItemThemeResource chatMessageItemLayout;
private HistoryMessageItemThemeResource historyMessageItemLayout;
private TabThemeResource tabItemLayout;
//Identifiers
private int topBarBackground;
private int bottomBarBackground;
private int screenBackground;
private int bottomBarButtonBackground;
private int accentBackground;
private int gridItemSize;
private int listItemHeight;
public ThemeResources build() {
return new ThemeResources(
gridItemLayout,
listItemLayout,
chatMessageItemLayout,
historyMessageItemLayout,
tabItemLayout,
topBarBackground,
bottomBarBackground,
screenBackground,
bottomBarButtonBackground,
accentBackground,
gridItemSize,
listItemHeight
);
}
public ThemeResources.Builder resourcesFromThemesManager(ThemesManager tm) {
if (tm != null) {
Context themeContext = tm.getCurrentThemeContext();
Context nativeContext = tm.getContext();
gridItemLayout = getResource(ContactListGridItemThemeResource.class, themeContext, nativeContext, "contact_list_grid_item", "layout", R.layout.contact_list_grid_item);
listItemLayout = getResource(ContactListPlainItemThemeResource.class, themeContext, nativeContext, "contact_list_plain_item", "layout", R.layout.contact_list_plain_item);
chatMessageItemLayout = getResource(ChatMessageItemThemeResource.class, themeContext, nativeContext, "chat_message", "layout", R.layout.chat_message);
tabItemLayout = getResource(TabThemeResource.class, themeContext, nativeContext, "tab_indicator", "layout", R.layout.tab_indicator);
//TODO
historyMessageItemLayout = new HistoryMessageItemThemeResource(nativeContext, R.layout.history_message);
accentBackground = themeContext.getResources().getIdentifier("accent_background", "drawable", themeContext.getPackageName());
topBarBackground = themeContext.getResources().getIdentifier("top_bar_background", "drawable", themeContext.getPackageName());
bottomBarBackground = themeContext.getResources().getIdentifier("bottom_bar_background", "drawable", themeContext.getPackageName());
screenBackground = themeContext.getResources().getIdentifier("screen_background", "drawable", themeContext.getPackageName());
bottomBarButtonBackground = themeContext.getResources().getIdentifier("bottom_bar_button_background", "drawable", themeContext.getPackageName());
gridItemSize = themeContext.getResources().getIdentifier("grid_item_size", "dimen", themeContext.getPackageName());
listItemHeight = themeContext.getResources().getIdentifier("list_item_height", "dimen", themeContext.getPackageName());
}
return this;
}
private <T extends ThemeResource> T getResource(Class<T> cls, Context themeContext, Context nativeContext, String idName, String idType, int fallbackResourceId) {
int id = themeContext.getResources().getIdentifier(idName, idType, themeContext.getPackageName());
T resource = null;
try {
Constructor<T> constructor = cls.getConstructor(Context.class, Integer.TYPE);
if (id != 0) {
resource = constructor.newInstance(themeContext, id);
} else {
resource = constructor.newInstance(nativeContext, fallbackResourceId);
}
} catch (Exception e) {
Logger.log(e);
}
return resource;
}
/**
* @param gridItemLayout the gridItemLayout to set
* @return
*/
public Builder gridItemLayout(ContactListGridItemThemeResource gridItemLayout) {
this.gridItemLayout = gridItemLayout;
return this;
}
/**
* @param listItemLayout the listItemLayout to set
* @return
*/
public Builder listItemLayout(ContactListPlainItemThemeResource listItemLayout) {
this.listItemLayout = listItemLayout;
return this;
}
/**
* @param chatMessageItemLayout the chatMessageItemLayout to set
* @return
*/
public Builder chatMessageItemLayout(ChatMessageItemThemeResource chatMessageItemLayout) {
this.chatMessageItemLayout = chatMessageItemLayout;
return this;
}
public Builder historyMessageItemLayout(HistoryMessageItemThemeResource historyMessageItemLayout) {
this.historyMessageItemLayout = historyMessageItemLayout;
return this;
}
public Builder tabItemLayout(TabThemeResource tabItemLayout) {
this.tabItemLayout = tabItemLayout;
return this;
}
public Builder topBarBackgroundId(int topBarBackground) {
this.topBarBackground = topBarBackground;
return this;
}
public Builder bottomBarBackgroundId(int bottomBarBackground) {
this.bottomBarBackground = bottomBarBackground;
return this;
}
public Builder screenBackgroundId(int screenBackground) {
this.screenBackground = screenBackground;
return this;
}
public Builder bottomBarButtonBackgroundId(int bottomBarButtonBackground) {
this.bottomBarButtonBackground = bottomBarButtonBackground;
return this;
}
public Builder accentBackgroundId(int accentBackground) {
this.accentBackground = accentBackground;
return this;
}
public Builder gridItemSizeId(int gridItemSize) {
this.gridItemSize = gridItemSize;
return this;
}
public Builder listItemHeightId(int listItemHeight) {
this.listItemHeight = listItemHeight;
return this;
}
}
}